home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / internet / irc_i_dodatki / eggdrop / eggdrop11.lha / scripts / dike.tcl < prev    next >
Text File  |  1997-01-15  |  4KB  |  145 lines

  1. #
  2. # detect floodnets  v2e
  3. #   by robey, butchbub, gord-
  4. #
  5.  
  6. bind msgm - * check_floodnet
  7. bind ctcp - * check_floodnet_ctcp
  8.  
  9. # last 5 msgs i received
  10. if {![info exists floodmsglist]} {
  11.   set floodmsglist {{0 nobody x} {0 nobody z} {0 nobody v} {0 nobody y} {0 nobody w}}
  12. }
  13.  
  14. set floodlistlen 5
  15. set floodalert 0
  16. # this means 3 of the previous 4 msgs have to be identical:
  17. set floodtrigger 4
  18. # the timespan between them has to be this small (seconds):
  19. set floodtime 10
  20.  
  21. proc check_floodnet_ctcp {nick uhost hand dest keyword text} {
  22.   check_floodnet $nick $uhost $hand "CTCP $keyword $text"
  23.   return 0
  24. }
  25.  
  26. proc check_floodnet {nick uhost hand text} {
  27.   global floodmsglist floodalert floodlistlen floodtime floodtrigger
  28.   # rotate floodmsglist
  29.   set floodmsglist [lreplace $floodmsglist 0 0]
  30.   lappend floodmsglist [list [unixtime] $nick!$uhost $text]
  31.   # timespan satisfied?
  32.   if {[unixtime]-[lindex [lindex $floodmsglist 0] 0] > $floodtime} {
  33.     if {$floodalert} { check_end_flood [expr $floodlistlen-1] }
  34.     return
  35.   }
  36.   # check for multiple
  37.   set count 0
  38.   for {set i 0} {$i < $floodlistlen-1} {incr i} {
  39.     if {[string compare [string tolower $text] \
  40.     [string tolower [lindex [lindex $floodmsglist $i] 2]]] == 0} { incr count }
  41.   }
  42.   if {$count < $floodtrigger} {
  43.     if {$floodalert} { check_end_flood [expr $floodlistlen-2] }
  44.     return
  45.   }
  46.   # okay this one counts
  47.   if {!$floodalert} {
  48.     # new flood
  49.     set floodalert 1
  50.     putlog "(**) I am being flooded, possibly by a floodnet."
  51.     putlog "(**) Entering dike mode."
  52.     trample_oldflood $text
  53.   }
  54.   add_floodnet $nick!$uhost
  55. }
  56.  
  57. bind bot - floodnotice floodnet_notice
  58. proc floodnet_notice {from cmd rest} {
  59.   set mask [lindex $rest 0]
  60.   set fullhost [lindex $rest 1]
  61.   putlog "($from) floodnet ignore: $mask ($fullhost)"
  62.   newignore $mask $from "(dike) floodnet: $fullhost" 0
  63. }
  64.  
  65. proc add_floodnet {fullhost} {
  66.   regsub "^\\*!" [maskhost $fullhost] "*!*" new
  67.   if {![isignore $new]} {
  68.     # uh, if it was on ignore, how did it trigger msgm?
  69.     putlog "floodnet ignore: $new ($fullhost)"
  70.     putallbots "floodnotice $new $fullhost"
  71.     newignore $new "dike" "floodnet: $fullhost" 0
  72.   }
  73. }
  74.  
  75. # every text from msg that matches the most recent one: part of the floodnet
  76. proc trample_oldflood {text} {
  77.   global floodlistlen floodmsglist
  78.   for {set i 0} {$i < $floodlistlen-2} {incr i} {
  79.     set theysaid [lindex [lindex $floodmsglist $i] 2]
  80.     set theysaid [string tolower $theysaid]
  81.     if {[string compare $theysaid [string tolower $text]] == 0} {
  82.       # match!
  83.       add_floodnet [lindex [lindex $floodmsglist $i] 1]
  84.     }
  85.   }
  86. }
  87.  
  88. proc check_end_flood {howfar} {
  89.   global floodalert floodlistlen floodmsglist
  90.   # if the previous message was ALSO different, we may be ok
  91.   set prevmsg [string tolower [lindex [lindex $floodmsglist $howfar] 2]]
  92.   set ok 1
  93.   for {set i 0} {$i < $howfar} {incr i} {
  94.     if {[string compare [string tolower [lindex [lindex $floodmsglist $i] 2]] $prevmsg] == 0} { set ok 0 }
  95.   }
  96.   if {! $ok} { return }
  97.   # must be over
  98.   putlog "(**) Floodnet bombardment seems to be over; leaving dike mode."
  99.   set floodalert 0
  100. }
  101.  
  102. if {![info exists dike_timer]} {
  103.   set dike_timer [timer 2 dike_check]
  104. }
  105. proc dike_check {} {
  106.   global dike_timer floodmsglist floodlistlen floodalert
  107.   if {$floodalert} {
  108.     # if last msg was 120 seconds ago, all is clear
  109.     set lastmsg [lindex [lindex $floodmsglist [expr $floodlistlen-1]] 0]
  110.     if {[unixtime]-$lastmsg > 120} {
  111.       check_end_flood 0
  112.     }
  113.   }
  114.   set dike_timer [timer 2 dike_check]
  115. }
  116.  
  117. # Procedure to kick/ban recognized floodnet bots from the 
  118. # channel on join.
  119. #       by Gord-
  120. # to enable this option, set to 1  
  121. # to disble, set to 0
  122. set enable_kb_floodnet 1
  123.  
  124. proc join_ignore_kb {nick uhost handle channel} {
  125.   if {![isignore $uhost]} {return 0}
  126.   foreach item [ignorelist] {
  127.     set hostmask [lindex $item 0]
  128.     set comment [lindex $item 1]
  129.     if {[string match $hostmask "$nick!$uhost"]} {
  130.       if {([string first "floodnet" [string tolower $comment]] != -1) || ([string first "fludnet" [string tolower $comment]] != -1)} {
  131.         newchanban $channel $hostmask "floodban" "Floodnet bots not welcome here."
  132.         putcmdlog "Floodnet bot $nick!uhost joined $channel - repelled!!"
  133.       }
  134.       break
  135.     }
  136.   }
  137.   return 0
  138. }
  139.  
  140. if {$enable_kb_floodnet} {
  141.   bind join - * join_ignore_kb
  142. }
  143.  
  144. putlog "dike (v2e) loaded; floodnet patrol armed & ready"
  145.